часть 1 | Обработка событий || Download

Прозрачная заставка в форме немодального диалога (часть 2)

(из книги "AutoCAD: разработка приложений, настройка и адаптация")

На рис. 5.63 показано окно заставки нашего приложения на фоне текущего рисунка. Окно открывается с помощью LISP-выражения (book16), вводимого в командной строке AutoCAD.

Рис. 5.63. Окно с прозрачной заставкой

Это прозрачное окно напоминает то окно, которое открывается при начальной загрузке AutoCAD.
Теперь рассмотрим конструктор окна (функцию Wform16::Wform16 в файле Splash16.cpp). Сначала идет задание параметров окна. Смысл свойств Size, StartPosition, Location и BackColor нам хорошо понятен по предыдущему примеру. (Прим. автора: размер, положение и цвет фона окна.)
Свойство Opacity задает коэффициент непрозрачности. Оно может принимать вещественные значения от 0 до 1. При 1 окно полностью непрозрачно, при 0 - полностью прозрачно (фактически не видно). В нашем случае использовано среднее значение (0.5).
Свойству FormBorderStyle задано значение None из перечисления FormBorderStyle. При этом значении окно не имеет ни рамки, ни заголовка (как в заставке системы AutoCAD).
Для размещения в центре окна надписи необходимо подготовить шрифт. Для этого создаются объекты классов FontFamily и Font. Шрифт используется в создаваемом объекте класса Label, который с помощью метода Add добавляется к семейству Controls элементов управления диалога.
Следующая строка конструктора добавляет обработчик события Click, т. е. щелчка внутри формы (но не на текстовом элементе, который имеет свое событие Click):

this->Click = new EventHandler(this, &Wform16::OnClick);

Обработчик события является объектом класса EventHandler. С помощью рассматриваемой строки с этим объектом связывается делегат - ссылка на функцию Wform16::OnClick. Это именно та функция, которая должна вызываться при возникновении отслеживаемого события.
Функция Wform16::OnClick имеет очень простое тело - в нем вызывается метод Close. Поэтому при щелчке внутри формы окно заставки закрывается.
Последние четыре оператора в конструкторе диалога создают таймер с определенными свойствами. Сам таймер, который генерирует сигналы с некоторой частотой, является объектом класса Timer. В FCL (Framework Class Library) одноименные классы присутствует в трех пространствах имен: System.Timer, System.Threading и System.Windows.Forms. В проекте Book16 мы выбрали последний из трех классов.
При создании таймера необходимо задать значения по крайней мере двум его свойствам:

Следующая строка создает обработчик события Tick (генерация сигнала таймера через заданные промежутки времени):

tm->add_Tick(new EventHandler(this,&Wform16::TimerOnTick));

Первый сигнал таймер выдаст через пять секунд после запуска. Этот сигнал в нашем примере должен стать и последним: функция Wform16::TimerOnTick останавливает таймер (используется метод Stop) и закрывает диалоговое окно.
Таймер необходимо останавливать (альтернатива - свойству Enabled присвоить значение false), ибо после этого автоматический сборщик мусора может освободить память, выделенную под таймер.
Таким образом, в нашем примере заставка появляется на экране в немодальном режиме (т. е. можно выполнять какие-то построения в рисунке в присутствии заставки) и исчезает, если пользователь щелкнет по ней или истечет пять секунд с момента запуска.
Если есть ненулевая вероятность одновременного запуска второй такой же заставки, то полезно добавить в приложение анализ предварительного существования диалога в оперативной памяти (достаточно для этого завести соответствующую глобальную переменную и проверять ее значение).


часть 1 | Обработка событий || Download